/**
 * 主JavaScript文件
 * 包含通用的JavaScript功能
 */

// 页面加载完成后执行
$(document).ready(function() {
    // 初始化提示工具
    initTooltips();
    
    // 自动隐藏提示消息
    autoHideAlerts();
    
    // 文件上传预览
    initFileUploadPreview();
    
    // 平滑滚动
    initSmoothScroll();
});

/**
 * 初始化Bootstrap提示工具
 */
function initTooltips() {
    var tooltipTriggerList = [].slice.call(
        document.querySelectorAll('[data-bs-toggle="tooltip"]')
    );
    var tooltipList = tooltipTriggerList.map(function(tooltipTriggerEl) {
        return new bootstrap.Tooltip(tooltipTriggerEl);
    });
}

/**
 * 自动隐藏提示消息
 * 5秒后自动隐藏alert消息
 */
function autoHideAlerts() {
    setTimeout(function() {
        $('.alert').not('.alert-permanent').fadeOut('slow', function() {
            $(this).remove();
        });
    }, 5000);
}

/**
 * 文件上传预览功能
 */
function initFileUploadPreview() {
    $('input[type="file"]').on('change', function() {
        var fileName = $(this).val().split('\\').pop();
        var fileSize = this.files[0] ? formatFileSize(this.files[0].size) : '';
        
        if (fileName) {
            var fileInfo = fileName + (fileSize ? ' (' + fileSize + ')' : '');
            console.log('已选择文件: ' + fileInfo);
        }
    });
}

/**
 * 格式化文件大小
 * @param {number} bytes - 文件大小（字节）
 * @returns {string} 格式化后的文件大小
 */
function formatFileSize(bytes) {
    if (bytes === 0) return '0 Bytes';
    
    const k = 1024;
    const sizes = ['Bytes', 'KB', 'MB', 'GB'];
    const i = Math.floor(Math.log(bytes) / Math.log(k));
    
    return Math.round(bytes / Math.pow(k, i) * 100) / 100 + ' ' + sizes[i];
}

/**
 * 平滑滚动到顶部
 */
function initSmoothScroll() {
    $('a[href^="#"]').on('click', function(e) {
        var target = $(this.getAttribute('href'));
        if (target.length) {
            e.preventDefault();
            $('html, body').stop().animate({
                scrollTop: target.offset().top - 80
            }, 800);
        }
    });
}

/**
 * 显示加载提示
 * @param {string} message - 提示消息
 */
function showLoading(message = '处理中...') {
    var loadingHtml = `
        <div id="loadingOverlay" style="
            position: fixed;
            top: 0;
            left: 0;
            width: 100%;
            height: 100%;
            background: rgba(0, 0, 0, 0.5);
            display: flex;
            align-items: center;
            justify-content: center;
            z-index: 9999;
        ">
            <div class="text-center text-white">
                <div class="spinner-border mb-3" role="status">
                    <span class="visually-hidden">加载中...</span>
                </div>
                <div>${message}</div>
            </div>
        </div>
    `;
    $('body').append(loadingHtml);
}

/**
 * 隐藏加载提示
 */
function hideLoading() {
    $('#loadingOverlay').fadeOut(300, function() {
        $(this).remove();
    });
}

/**
 * 显示成功提示
 * @param {string} message - 提示消息
 */
function showSuccess(message) {
    showAlert(message, 'success');
}

/**
 * 显示错误提示
 * @param {string} message - 错误消息
 */
function showError(message) {
    showAlert(message, 'danger');
}

/**
 * 显示警告提示
 * @param {string} message - 警告消息
 */
function showWarning(message) {
    showAlert(message, 'warning');
}

/**
 * 显示信息提示
 * @param {string} message - 信息消息
 */
function showInfo(message) {
    showAlert(message, 'info');
}

/**
 * 显示Alert消息
 * @param {string} message - 消息内容
 * @param {string} type - 消息类型 (success, danger, warning, info)
 */
function showAlert(message, type = 'info') {
    var icons = {
        'success': 'fa-check-circle',
        'danger': 'fa-exclamation-circle',
        'warning': 'fa-exclamation-triangle',
        'info': 'fa-info-circle'
    };
    
    var alertHtml = `
        <div class="alert alert-${type} alert-dismissible fade show" role="alert">
            <i class="fas ${icons[type]}"></i> ${message}
            <button type="button" class="btn-close" data-bs-dismiss="alert"></button>
        </div>
    `;
    
    // 滚动到顶部
    $('html, body').animate({ scrollTop: 0 }, 300);
    
    // 显示消息
    $('.container').first().prepend(alertHtml);
    
    // 5秒后自动隐藏
    setTimeout(function() {
        $('.alert').not('.alert-permanent').fadeOut('slow', function() {
            $(this).remove();
        });
    }, 5000);
}

/**
 * 验证文件类型
 * @param {File} file - 文件对象
 * @param {Array} allowedTypes - 允许的文件类型数组
 * @returns {boolean} 是否为允许的文件类型
 */
function validateFileType(file, allowedTypes) {
    var fileName = file.name;
    var fileExt = fileName.substring(fileName.lastIndexOf('.')).toLowerCase();
    return allowedTypes.includes(fileExt);
}

/**
 * 验证文件大小
 * @param {File} file - 文件对象
 * @param {number} maxSize - 最大文件大小（字节）
 * @returns {boolean} 文件大小是否符合要求
 */
function validateFileSize(file, maxSize) {
    return file.size <= maxSize;
}

/**
 * 下载文件
 * @param {string} filename - 文件名
 * @param {string} url - 下载URL（可选）
 */
function downloadFile(filename, url) {
    if (!url) {
        url = '/tools/download/' + filename;
    }
    
    var link = document.createElement('a');
    link.href = url;
    link.download = filename;
    document.body.appendChild(link);
    link.click();
    document.body.removeChild(link);
}

/**
 * 复制文本到剪贴板
 * @param {string} text - 要复制的文本
 */
function copyToClipboard(text) {
    var textarea = document.createElement('textarea');
    textarea.value = text;
    textarea.style.position = 'fixed';
    textarea.style.opacity = '0';
    document.body.appendChild(textarea);
    textarea.select();
    
    try {
        document.execCommand('copy');
        showSuccess('已复制到剪贴板');
    } catch (err) {
        showError('复制失败');
    }
    
    document.body.removeChild(textarea);
}

/**
 * 格式化日期
 * @param {Date} date - 日期对象
 * @param {string} format - 格式字符串
 * @returns {string} 格式化后的日期字符串
 */
function formatDate(date, format = 'YYYY-MM-DD') {
    var year = date.getFullYear();
    var month = String(date.getMonth() + 1).padStart(2, '0');
    var day = String(date.getDate()).padStart(2, '0');
    var hours = String(date.getHours()).padStart(2, '0');
    var minutes = String(date.getMinutes()).padStart(2, '0');
    var seconds = String(date.getSeconds()).padStart(2, '0');
    
    return format
        .replace('YYYY', year)
        .replace('MM', month)
        .replace('DD', day)
        .replace('HH', hours)
        .replace('mm', minutes)
        .replace('ss', seconds);
}

/**
 * 防抖函数
 * @param {Function} func - 要执行的函数
 * @param {number} wait - 等待时间（毫秒）
 * @returns {Function} 防抖后的函数
 */
function debounce(func, wait = 300) {
    let timeout;
    return function executedFunction(...args) {
        const later = () => {
            clearTimeout(timeout);
            func(...args);
        };
        clearTimeout(timeout);
        timeout = setTimeout(later, wait);
    };
}

/**
 * 节流函数
 * @param {Function} func - 要执行的函数
 * @param {number} limit - 时间限制（毫秒）
 * @returns {Function} 节流后的函数
 */
function throttle(func, limit = 300) {
    let inThrottle;
    return function() {
        const args = arguments;
        const context = this;
        if (!inThrottle) {
            func.apply(context, args);
            inThrottle = true;
            setTimeout(() => inThrottle = false, limit);
        }
    };
}

// 导出函数供其他脚本使用
window.AppUtils = {
    showLoading,
    hideLoading,
    showSuccess,
    showError,
    showWarning,
    showInfo,
    showAlert,
    validateFileType,
    validateFileSize,
    downloadFile,
    copyToClipboard,
    formatDate,
    formatFileSize,
    debounce,
    throttle
};

